#!/usr/bin/env python
# -*- coding:utf-8 -*-


'''
@CreateTime: 2020/11/05 9:45
@Author : shouke
'''

scenario_config={ #scenario_config 名称固定。不可更改
    "id": 1, #场景id
    "name": "压测场景名称",
    "target_user_count": 20,#分配的总压测用户数
    "spawn_rate": 5, # 每秒启动用户数（仅用于控制启动用户的速率
    # add 配置项的值为空字符串、0、None，则默认add值为target_user_count
    "add":5,  # 启动压测试时，启动Y个用户，然后add Y every interval seconds 即刚开始时启动Y个用户，然后每 interval 秒 增加 Y 个用户，直到达到 target_user_count
    "interval":30, # 单位秒
    "hold_load_time": 5,# 每台slave压测机维持负载运行时间(不包括用户启动耗时和结束耗时),要求大于0
    "iteration_num_each_user":1, # 每个用户迭代运行次数(每执行完一条链路算一次迭代) 如果该配置大于0，则每个用户运行该配置项指定次数，否则自动忽略该配置项
    "stop_rate": 5,#每秒停止用户数
    "host": "http://127.0.0.1:8001",#接口地址不能为空， 且必须填写正确
    #  如果同时提供了“ iteration_wait_time”，“ iteration_min_wait” 及“ iteration_max_wait”， 则优先判断iteration_wait_time
    #  iteration_min_wait和iteration_max_wait 必须配合使用， 随机生成等待时间【 iteration_min_wait,iteration_max_wait)， 且两者都不能为空
    "iteration_min_wait": "", #每个用户每运行完一轮压测(执行完一条链路)， 开始下一轮压测前的最小等待时间
    "iteration_max_wait": "", #每个用户每运行完一轮压测(执行完一条链路)， 开始下一轮压测前的最大等待时间
    "iteration_wait_time": 0, #每个用户每运行完一轮压测(执行完一条链路)， 开始下一轮压测前的固定等待时间
    "scenario": [{
        "id": 1, #链路id
        "name": "链路1",
        "weight": 5,
        "chain": [{
                "action": "exec_once_only_controller",
                "name": "仅运行一次控制器",
                "id": 5,#该步骤动作函数的唯一标识
                "children": [{
                        "action": "read_csv_file_data",
                        "name": "帐号密码参数配置",
                        "fileName": "./data/argfile.txt",
                        "fileEncoding": "utf-8",
                        "variableNames": "username,password", #要求变量名称场景内唯一（ 不同链路中定义的变量不能重复）
                        "ignoreFirstLine": True, #是否忽略第一行 True 是 False 否
                        "delimiter": ",",#变量， 变量值之间的分隔符
                        "recyleOnEOF": True, #是否循环读取 True 循环读取 False 不循环
                        "independently_each_user": False # 是否每个用户独立 True 等价于每个用户从不同的文件副本读取各自所需要的数据， False 等价于每个用户用同一个文件指针、 文件句柄读取同一份文件
                    },
                    {
                        "action": "send_request",
                        "name": "请求登录",
                        "method": "POST",
                        "path": "/api/v1/login", #可以是绝对URL， 形如http: //127.0.0.1:8002/api/v1/login，也可以是相对URL,形如 /api/v1/login
                        "data": None,
                        "stream": False,
                        "headers": {
                            "Content-Type": "application/json"
                        },
                        "auth": None,
                        "json": {
                            "account": "${username}",
                            "password": "${password}"
                        },
                        "allow_redirects": True,
                        "children": [{ # 如果不配置响应断言，系统会执行默认断言 响应状态码为 200，201，301则算通过
                            "action": "assert_response",
                            "name": "请求响应断言",
                            "target": "body", # 断言目标，暂时支持body - 响应体,header - 响应头,status - 响应状态码
                            "rule": "assert_contain", #模式要匹配的规则,目前支持 assert_contain 包含  assert_equal 等于
                            "patterns": ["赖玉", "token"], # 模式 [模式1，模式2，模式3]
                            "logic":"or" # 模式之间的逻辑关系 and 、or  可不配置logic配置项，默认为and
                        }, {
                            "action": "extract_by_regexp",#正则表达式提取器 "name": "正则表达式提取器",
                            "name":"正则表达式提取器",
                            "refName": "userInfo", #引用名称 # 不能为空
                            "express": 'username":"(.+?)",.+token":"(.+?)",', #正则表达式
                            "target": "body", # 提取源对象
                            "template": "$1$$2$$0$", # 默认为$0$ $0$-取分组0数据（分组1到分组n按顺序拼接起来的数据） $1$-取分组1数据 $2$-取分组2数据 以此类推,如果给定索引越界
                            "matchNo": 0 # 默认为0，取分组中指定匹配索引的数据 matchNo 0开始，0表示随机，1表示取分组中第一个值 2 取第二个分组的值 以此类推， 如果越界，提取结果为空
                        }]
                    }
                ]
            }, {
                "action": "send_request",
                "name": "获取菜单",
                "method": "GET",
                "path": "/api/v1/user/menus",
                "data": None,
                "stream": False,
                "headers": None,
                "auth": None,
                "json": None,
                "allow_redirects": True,
                "children": [{
                    "action": "assert_response",
                    "name": "请求响应断言",
                    "target": "status",
                    "rule": "assert_equal",
                    "patterns": [200]
                }]
            }, {
                "action": "exec_counter",
                "name": "counter1",
                "refName": "counter1", #要求计数器引用名称场景内唯一（ 不同链路中定义的计数器引用变量不能重复）
                "value": 1, #初始值
                "increment": 2, #增量步长值
                "maximum": 1000, #最大值
                "numberFormat": "100000", #未实现
                "independently_each_user": False # 是否每个用户独立 True 每个用户拥有自己的独立计数器 False 所有用户共享一个计数器
            }
        ]
    }, {
        "id": 2,
        "name": "链路2",
        "weight": 3,
        "chain": [{
            "action": "send_request",
            "name": "请求订单",
            "method": "GET",
            "path": "/api/v1/order/1",
            "data": None,
            "stream": False,
            "headers": {
                "Content-Type": "application/x-www-form-urlencode"
            },
            "auth": None,
            "json": None,
            "allow_redirects": True
        }]
    }]
}